package com.xinwei.leetcode.数组;

import java.util.ArrayList;
import java.util.List;

// https://leetcode-cn.com/problems/summary-ranges/
public class _228_汇总区间 {
    // 失败 原因：开头的判断在i上，结尾的判断却在i + 1上，前后不一致导致失败
    public static List<String> summaryRanges(int[] nums) {
        int begin = -1; // 表示该位置是否为开头
        ArrayList<String> list = new ArrayList<>();
        if (nums.length == 0) return list;
        for (int i = 0; i < nums.length; i++) {
            if (begin == -1) {
                begin = i - 1;
            }else {
                if (nums[i] != nums[i - 1] + 1) {
                    if (i == begin + 1){
                        list.add(Integer.toString(begin));
                    }else {
                        list.add(nums[begin] + "->" + nums[i - 1]);
                    }
                    if (i == nums.length - 1) list.add(Integer.toString(nums[i]));
                    begin = -1;
                }
            }
        }
        return list;
    }

    // 改进 结尾的判断方式，使判断落在i上
    public static List<String> summaryRanges1(int[] nums) {
        int begin = -1; // 表示该位置是否为开头
        ArrayList<String> list = new ArrayList<>();
        if (nums.length == 0) return list;
        for (int i = 0; i < nums.length - 1; i++) {
            if (begin == -1) {
                begin = i;
            }
            if (nums[i + 1] != nums[i] + 1) {
                if (i == begin){
                    list.add(Integer.toString(nums[begin]));
                }else {
                    list.add(nums[begin] + "->" + nums[i]);
                }
                begin = -1;
            }else if (i == nums.length - 2) {
                list.add(nums[begin] + "->" + nums[nums.length - 1]);
            }
        }
        if (begin == -1) list.add(Integer.toString(nums[nums.length - 1]));
        return list;
    }

    // 官解  (改变了添加的方法) -->使用的时间很长，因为用add会进行扩容，所以当要返回list时，直接使用StringBuilder能够省很多时间
    // 1、while使用i++ 和for循环的区别：可以自主的控制在循环中的哪个位置进行i++
    // 2、怎么做到无需判断开头？通过内层循环加快跳过中间部分，直接到达结尾，使下一个i就是开头
    public static List<String> summaryRanges2(int[] nums) {
        ArrayList<String> list = new ArrayList<>();
        int i = 0;
        while (i < nums.length) {
            int low = i;
            i++;
            while (i < nums.length && nums[i] == nums[i - 1] + 1) {
                i++;
            }
            int high = i - 1;
            if (low < high) {
                list.add(Integer.toString(nums[low]) + "->" + Integer.toString(nums[high]));
            }else {
                list.add(Integer.toString(nums[low]));
            }
        }
        return list;
    }

    public static List<String> summaryRanges3(int[] nums) {
        ArrayList<String> list = new ArrayList<>();
        int i = 0;
        StringBuilder builder = new StringBuilder();
        while (i < nums.length) {
            int low = i;
            i++;
            while (i < nums.length && nums[i] == nums[i - 1] + 1) {
                i++;
            }
            int high = i - 1;
            builder.append(nums[low]);
            if (low < high) {
                builder.append("->" + nums[high]);
            }
        }
        list.add(builder.toString());
        return list;
    }

    public static List<String> test(int[] nums) {
        ArrayList<String> list = new ArrayList<>();
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < nums.length; i++) {
            buffer.append(nums[i]);
        }
        list.add(buffer.toString());
        return list;
    }
}
